package com.t.bricks.bussiness.util.lucene;

import java.lang.reflect.ParameterizedType;
import java.util.List;

import com.t.bricks.model.MsgEmity;
import com.t.bricks.model.Page;

/**
 * 对指定数据类型进行搜索引擎操作
 * @param <T>
 */
public abstract class Lucene<T> {
	
	/**
	 * 搜索引擎文件主路径
	 */
	private static String lucenePath = String.format("%s/temp/lucene/", System.getProperty("user.dir").replaceAll("\\\\", "/"));

	/**
	 * 库,例:"D:\\usr\\lucene\\index";
	 */
	private String core;
	
	/**
	 * 对应的数据实体
	 */
	private Class<T> entityClass = null;
	
	/**
	 * 构造函数
	 */
	public Lucene() {

	}
	
	/**
	 * 取当前泛型的类型
	 * @return
	 */
	@SuppressWarnings("unchecked")
	protected Class<T> getGenericClass() {
		if (null != entityClass) {
			return entityClass;
		}
		
        ParameterizedType parameterizedType = (ParameterizedType) getClass().getGenericSuperclass();
        entityClass = (Class<T>) parameterizedType.getActualTypeArguments()[0];
        
        return entityClass;
	}
	
	/**
	 * 获取库文件地址
	 * @return
	 */
	private String getCore() {
		if (null != this.core) {
			return this.core;
		}
		
		this.core = String.format("%sindex/%s", lucenePath, getGenericClass().getSimpleName());
		
		return this.core;
	}

	/**
	 * 添加数据
	 * @param idName 索引库中的id对应的字段属性名,如果没有则自创
	 * @param obj
	 * @return
	 */
	public MsgEmity add(String idName, T obj) {
		return LuceneFactory.add(idName, obj, getCore());
	}

	/**
	 * 删除数据
	 * @param idName
	 * @param idValue
	 * @return
	 */
	public MsgEmity del(String idName, String idValue) {
		return LuceneFactory.del(idName, idValue, getCore());
	}

	/**
	 * 更新数据
	 * 注意:lucene的update比较特殊，update的代价太高，其实是先删除，然后在插入
	 * @param idName
	 * @param idValue
	 * @param obj
	 * @return
	 */
	public MsgEmity update(String idName, String idValue, T obj) {
		return LuceneFactory.update(idName, idValue, obj, getCore());
	}

	/**
	 * 查询多个字段
	 * @param keys 关键字 {"字段1关键字", "字段2关键字"}
	 * @param rels 条件关系 {"OR", "ANd", "NOT"}
	 * @param page 分页信息
	 * @return
	 */
	public MsgEmity search(List<String> keys, List<String> rels, Page page) {
		return LuceneFactory.search(keys, rels, null, page, getGenericClass(), getCore());
	}

	/**
	 * 查询多个字段
	 * @param keys 关键字 {"字段1关键字", "字段2关键字"}
	 * @param page 分页信息
	 * @param clazz 返回的数据类型
	 * @return
	 */
	public MsgEmity search(List<String> keys, Page page) {
		return LuceneFactory.search(keys, null, page, getGenericClass(), getCore());
	}

	/**
	 * 查询单个字段
	 * @param field 待查字段
	 * @param key 关键字(只有一个),如果含有空格,则按or条件处理
	 * @param page 分页信息
	 * @param clazz 返回的数据类型
	 * @return
	 */
	public MsgEmity search(String field, String key, Page page) {
		return LuceneFactory.search(field, key, null, page, getGenericClass(), getCore());
	}

	/**
	 * 查询contents字段
	 * @param key 关键字(只有一个),如果含有空格,则按or条件处理
	 * @param page 分页信息
	 * @return
	 */
	public MsgEmity search(String key, Page page) {
		return LuceneFactory.search(key, page, getGenericClass(), getCore());
	}
	
}
